package controlsystem;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;

import java.util.List;

import managesystem.Student;
import managesystem.StudentManager;
import tracksystem.Activity;
import tracksystem.SchoolActivity;

/**
 * MilestoneController beheert het toevoegen van milestones door de student.
 * MilestoneController moet de huidige milestones doorgeven aan het dashboard.
 */

/**
 * @author r0254853 en Christiaan Leysen
 *
 */
public class MilestoneController {
        
        
        /**
         * 
         * @param course
         * @param description
         * @param endDate
         * @param type
         * @param value
         */

        
                
        static public Student makeMilestone(Course course, String description, Date endDate, String type, int value, Student currStud){
                Milestone milestone = new Milestone(course, description, endDate, type, value);
                currStud.addMilestone(milestone);
                StudentManager.add(currStud);
                return currStud;
        }
        
        /**
         * Kijkt na of de currentStudent genoeg heeft gedaan om de  
         * milestone te bereiken.
         * @param days aantal dagen voordat de milestone moet afgehandeld zijn.
         */
        static private HashMap<Milestone, Long> checkprogress(Student currStud){
                Collection<Milestone> milestones = currStud.getMilestones();
                //maakt een hashmap met de vooruitgang van elke milestone
                HashMap<Milestone,Long> progresses = new HashMap<Milestone, Long>();
                Iterator<Milestone> iterator = milestones.iterator();
                while(iterator.hasNext() == true){
                        Milestone milestone= iterator.next();
                        long progress = progressMilestone(milestone, currStud);
                        progresses.put(milestone,progress);
                }
                return progresses;
        }

        /**
         * Controlleert hoeveel er al gedaan is voor een bepaalde milestone
         * @param milestone
         * @return aantal pagina's of tijd dat al gedaan is voor de milestone (de tijd in miliseconden)
         */
        public static long progressMilestone(Milestone milestone, Student currStud){
                Course course = milestone.getCourse(); //over welk vak gaat de milestone
                Collection<Activity> activities = currStud.getAct(); //de lijst van activiteiten ophalen
                
                
                Date date = milestone.getEndDate();//datum wanneer de milestone eindigd
                Date startDate= milestone.getDate();//de datum waarop de milestone is aangemaakt
                long pagesOrDuration = 0;
                //iteratie over alle activiteiten om het aantal pagina's of uren te bereken naargelang
                //de doelstelling van de milestone
                Iterator<Activity> iterator = activities.iterator();
                while(iterator.hasNext() == true){
                        Activity activity = iterator.next(); //haalt een activiteit op
                        //controle of de activiteit een schoolActivity is
                        if(activity instanceof SchoolActivity){
                                Course courseActivity = ((SchoolActivity) activity).getCourse(); //ophalen op welke course de activiteit betrekking heeft
                                
                                //controle of de course overeen komt
                                if(courseActivity.getName().equals(course.getName())){
                                            
                                        //controlleren of milestone # pagina's als doel heeft en het aantal pagina's
                                        //berekenen.
                                        if(milestone.getType().equals("Number of pages")){
         
                                                Date activityDate = activity.getStart();
                                                
                                                if(course.getName().equals(courseActivity.getName()) && courseActivity != null && activityDate.before(date) ==true &&activityDate.after(startDate) == true){
                                                        pagesOrDuration = pagesOrDuration + ((SchoolActivity) activity).getPages(); //hier is pagesOrDuration de pagina's
                                                        
                                                }
                                        }
                                        //controlleren of milestone # uren als doel heeft en het aantal uren
                                        //berekenen.
                                        if(milestone.getType().equals("Number of hours")){
                                                   
                                                Date activityDate = activity.getStart();
                                                if(course.getName().equals(courseActivity.getName()) && courseActivity != null && activityDate.before(date) == true&&activityDate.after(startDate) == true){
                                                        pagesOrDuration = pagesOrDuration + activity.getDuration(); //hier is pagesOrDuration de tijd
                                                        
                                                }
                                        }
                                }
                              
                        }
                }
                
                return pagesOrDuration;
        }
        
        /**
         * Retourneert een arraylist met informatie over de verschillende milestones
         * met commentaar hoe goed/slecht er gewerkt is aan de milestone
         * @return een arraylist met Strings
         */
        static public ArrayList<String> getNotifications(Student currStud){
                Collection<Milestone> milestones = currStud.getMilestones();
                //genereren van een arraylist met strings
                ArrayList<String> notifications = new ArrayList<String>();
                HashMap<Milestone,Long> progresses = checkprogress(currStud);//kijkt na hoever dat de student al geraakt is
                Iterator<Milestone> iterator = milestones.iterator();
                while(iterator.hasNext() == true){
                        Milestone milestone = iterator.next();
                        String description = milestone.getDescription();
                        String type = milestone.getType();
                        int value = milestone.getValue();
                        long progress = progresses.get(milestone);
                        //de string die in de arraylist wordt gestoken
                        String notification = "milestone( " + description + "):" + progress + " / " + value + " " + type;
                        notifications.add(notification);
                }
                return notifications;
        }
        

        
        /**
         * retourneert welke milestones al behaald zijn door de student
         * @return een lijst met alle behaald milestones
         */
        static public ArrayList<Milestone> completedMilestones(Student currStud){
                Collection<Milestone> milestones = currStud.getMilestones();
                HashMap<Milestone,Long> progresses = checkprogress(currStud);
                //een arraylist maken met voltooide milestones
                ArrayList<Milestone> completedMilestones = new ArrayList<Milestone>();
                Iterator<Milestone> iterator = milestones.iterator();
                while(iterator.hasNext() == true){
                        Milestone milestone = iterator.next();
                        long progress = progresses.get(milestone);
                        int value = milestone.getValue();
                        //wanneer de vooruitgang even groot is als de vooropgestelde waarde,
                        //dan is de milestone voltooid
                        if(progress == value){
                                completedMilestones.add(milestone);
                        }
                }
                return completedMilestones;
        }
       
        public static HashMap<String,Long>milestoneProgress(Student currStud)
        {
                HashMap<String,Long> milestoneProgress =new HashMap<String,Long>();
                
                
                List<Milestone> milestones=currStud.getMilestones();
                
                for(Milestone milestone: milestones)
                {
                        long progress=MilestoneController.progressMilestone(milestone,currStud);
                        milestoneProgress.put(milestone.getCourse().getName(), progress);
                }
                return milestoneProgress;
        }
        
        /**
         * 
         * @param milestones van de student
         * @param student current student
         *methode om een lijst van milestones.
         * @return ArrayList met milestones waarvan de progress is ge-update
         */
        public static List<Milestone> checkProgress (Student student)
        {   List<Milestone> milestones=student.getMilestones();
                for(Milestone milestone:milestones)
        {
             milestone.setProgress(progressMilestone(milestone,student));
            
        }
        
        student.setMilestones(milestones);
        
        return milestones;
        }
        /**
         * methode om alle posisties van de milestones in de grafieklijst op 0 te zetten
         * @param currStud
         */
        public static void deleteAllPositions(Student currStud)
        {
               List<Milestone> milestones=currStud.getMilestones();
                Iterator<Milestone> it = milestones.iterator();
                while (it.hasNext()) {
                        Milestone milestone = it.next();
                        milestone.setPosition(0);
                
        }
                
        /**
         * @param Student current student
         * @param int positie van de milestone
         * @return milestones op deze positie
         */
}
        public static Milestone findMilestoneByPosition(Student currStud,int pos)
        {   Milestone gevonden=null;
                List<Milestone> milestones=currStud.getMilestones();
                Iterator<Milestone> it = milestones.iterator();
                while (it.hasNext()) {
                        Milestone milestone = it.next();
                        if(milestone.getPosition()==pos)
                        {                               
                                gevonden=milestone;
                        }
                        
                
        }   
                return gevonden;
        }
}
